<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // 1- bind是Function.prototype下的一个方法
    // 2- bind返回的是一个函数（该函数是复制了fn）。
    // 3- 返回的函数中的this的指向由bind接收的第一个参数决定。
    // 4- 返回的函数接收的参数可以通过bind进行绑定。（从第二个参数开始）
    // Function.prototype.bind = function(content){
    //     if(typeof content === "string" || typeof content === "number" || typeof content == "boolean"){
    //         content = new Object(content);
    //     }else if(content === null || content === undefined){
    //         content = window;
    //     }
    //     const _this = this;
    //     const fnName = Math.random().toString(36).slice(2);
    //     // console.log(Array.from(arguments).slice(1))
    //     const arg1 = Array.from(arguments).slice(1);
    //     return function(){
    //         // console.log(Array.from(arguments))
    //         const arg2 = Array.from(arguments);
    //         Object.prototype[fnName] = _this;
    //         const result = eval("content[fnName]("+arg1.concat(arg2).join(',')+")");
    //         delete Object.prototype[fnName];
    //         return result;
    //
    //     }
    // }


    // 优化
    Function.prototype.apply = function(content,arg){
        if(typeof content === "string" || typeof content === "number" || typeof content === "boolean"){
            content = new Object(content);
        }else if(content === null || content === undefined){
            content = window;
        }
        const fnName = Math.random().toString(36).slice(2);
        Object.prototype[fnName] = this;
        // const result = content[fnName](...arg);
        const result = eval("content[fnName]("+arg.join(',')+")")
        // console.log("content[fnName]("+arg.join(',')+")")
        delete Object.prototype[fnName];
        return result;

    }
    Function.prototype.bind = function(content){
        const _this = this;
        const arg1 = Array.from(arguments).slice(1);
        return function(){
            return _this.apply(content,arg1.concat(Array.from(arguments)))
        }
    }
    function fn(a,b,c,d,e,f){
        console.log("fn",this,a,b,c,d,e,f);
    }
    const fn2 = fn.bind(1,2,3,4);
    fn2(5,6,7);
</script>
</html>